草庐IT

CountDownLatch和ExecutorService 线程池cachedThreadPool.submit

全部标签

多线程系列(十五) -常用并发工具类详解

一、摘要在前几篇文章中,我们讲到了线程、线程池、BlockingQueue等核心组件,其实JDK给开发者还提供了比synchronized更加高级的线程同步组件,比如CountDownLatch、CyclicBarrier、Semaphore、Exchanger等并发工具类。下面我们一起来了解一下这些常用的并发工具类!二、常用并发工具类2.1、CountDownLatchCountDownLatch是JDK5之后加入的一种并发流程控制工具类,它允许一个或多个线程一直等待,直到其他线程运行完成后再执行。它的工作原理主要是通过一个计数器来实现,初始化的时候需要指定线程的数量;每当一个线程完成了自己

Java - 多个线程写入同一个文件

这个问题在这里已经有了答案:Writingafileusingmultiplethreads(3个答案)关闭7年前。我正在尝试通过Java中的多个线程将一些内容写入文件。每个线程读取不同的输入文件,进行一些计算并将一些(不同的)内容写入公共(public)输出文件。问题在于,最终输出文件只包含最后一个终止线程写入的内容,而不包含其他线程写入的内容。线程的相关代码-publicvoidrun(){try{Filefile=newFile("/home/output.txt");if(!file.exists()){file.createNewFile();}FileWriterfw=ne

java - 静态内部类线程在另一个 java 类中是否安全?

为了收集更小的辅助工具类,我创建了一个通用的classMyUtils://MyUtils.javapublicfinalclassMyUtils{publicstaticclassHelper1{};publicstaticclassHelper2{};//...}MyUtils中的辅助类将在包的其他文件中使用://MyClass1.javapublicclassMyClass1{privateMyUtils.Helper1help1=newMyUtils.Helper1();publicvoidmethod(){privateMyUtils.Helper2help2=newMyUti

java - 如何找到父线程的名字?

我知道在谈论流程时我们可以有“parent”和“child”。但是是否有可能获得父Thread名称?我做了研究,但我只找到了.Net的答案编辑:我尝试设置名称:publicclassMain{publicstaticvoidmain(String[]args){Threadr=newThreadA();r.start();}}publicclassThreadAextendsThread{publicvoidrun(){Thread.currentThread().setName("ThreadA");System.out.println("Here"+Thread.currentTh

java - 在 Java 的线程中使用 PreparedStatements 是否正确?

我仍然是一名兼职工作的本科生,所以我一直在努力了解更好的做事方式。最近我不得不编写一个工作程序,其中程序的主线程将生成“任务”线程(对于每个数据库“任务”记录),这些线程将执行一些操作,然后更新记录以表明它已完成。因此,我需要ThreadedTask对象中或可用的数据库连接对象和PreparedStatement对象。这就是我最终写的大致内容,每个线程创建一个PreparedStatement对象是一种浪费吗?我认为静态PreparedStatments会造成竞争条件...ThreadAstmt.setInt();ThreadBstmt.setInt();ThreadAstmt.exe

java - ThreadPoolExecutor 具有自定义行为的固定线程池

我是这个主题的新手...我正在使用通过Executors.newFixedThreadPool(10)创建的ThreadPoolExecutor,在池满后我开始得到RejectedExecutionException。有没有办法“强制”执行者将新任务置于“等待”状态,而不是拒绝它并在池释放时启动它?谢谢关于这个的问题https://github.com/evilsocket/dsploit/issues/159涉及的代码行https://github.com/evilsocket/dsploit/blob/master/src/it/evilsocket/dsploit/net/Net

java - 为什么通过 newCachedThreadPool 创建的 ExecutorService 是邪恶的?

保罗·泰玛presentation有这一行:Executors.newCacheThreadPoolevil,diediedie为什么它是邪恶的?我会大胆猜测:是不是因为线程数量会无限增长。因此,如果达到JVM的最大线程数,已被斜线标记的服务器可能会挂掉? 最佳答案 (这是保罗)幻灯片的目的是(除了有滑稽的措辞),正如您提到的,线程池在不受限制地创建新线程的情况下增长。线程池本质上代表系统内的队列和工作传输点。也就是说,有些事情正在为它提供工作(并且它也可能正在为其他地方提供工作)。如果线程池开始增长,那是因为它跟不上需求。一般来说

java - 为什么同步方法允许多个线程并发运行?

我在同一文件中有以下程序。我已经同步了run()方法。classMyThread2implementsRunnable{Threadt;MyThread2(Strings){t=newThread(this,s);t.start();}publicsynchronizedvoidrun(){for(inti=0;i输出是Threadname:MyThread1Threadname:MyThread4Threadname:MyThread4Threadname:MyThread1Threadname:MyThread1Threadname:MyThread4我的问题是为什么同步方法允许同

Java 多线程 - 线程安全计数器

我从一个非常简单的多线程示例开始。我正在尝试制作一个线程安全的计数器。我想创建两个线程来间歇性地增加计数器以达到1000。代码如下:publicclassThreadsExampleimplementsRunnable{staticintcounter=1;//aglobalcounterpublicThreadsExample(){}staticsynchronizedvoidincrementCounter(){System.out.println(Thread.currentThread().getName()+":"+counter);counter++;}@Overridep

java - String get/set 是线程安全的吗?

假设我有以下内容,publicclassFoo{privateStringbar;publicStringgetBar(){returnbar;}publicvoidsetBar(Stringbar){this.bar=bar;}}由于String类的不可变特性,这些方法是否自动线程安全,或者是否需要某种锁定机制? 最佳答案 不,这不是线程安全的。Foo是可变的,所以如果你想确保不同的线程看到相同的值bar–即一致性–或者:制作barvolatile,或制作方法synchronized,或使用AtomicReference.bar的